package cn.gok.controller;

import cn.gok.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.Mapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.validation.Valid;
import java.util.List;

/**
 * @author: chen fan
 * @since: 2022/11/8 11:48
 * @description:
 */
@Controller
public class UserController {


    @RequestMapping("/addUser.html")
    public String toAddUserPage(){
        return "addUser";
    }

    /**
        开启JSR303校验：
            1、在实体类的属性上添加相关注解，编写校验规则和提示信息
            2、在@RequestMapping方法的参数前面，添加@Valid注解，表示要对该实体进行JSR303校验
            3、校验完成后，SpringMVC 会将检查到数据错误信息会封装到BindingResult对象中
               我们通过获取该对象，就可以知道哪些数据有问题。
               BindingResult中提供了以下常用方法：
                        hasErrors()： 	返回为true表示检查数据时出现了错误
                        getFieldErrors()： 该方法返回全部错误信息的集合List<FieldError>
                                            验证器会将每条错误信息都封装一个FieldError对象中，
                                            主要是错误的字段和提示信息
               FieldError对象提供的方法
                        getField() ：          获取出现错误的字段
                        getDefaultMessage（）： 获取错误提示信息
     */
    @PostMapping("/addUser")
    public String addUser(@Valid User user, BindingResult bindingResult, ModelMap modelMap){

        if (bindingResult.hasErrors()){
            //数据有问题,将提示信息返回到前端
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for (FieldError fieldError : fieldErrors) {
                //以错误的字段名作为key，以提示作为value响应给前端
                modelMap.addAttribute(fieldError.getField(),fieldError.getDefaultMessage());
            }
            //原始数据回显
            modelMap.addAttribute("user",user);

            //跳转会原始的界面
            return "addUser";
        }

        System.out.println(user);
        return "success";
    }
}
